/*
 * Tarifa.java
 *
 * Created on 8 de mayo de 2006, 09:06 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package inc.jmc.cyberboard;

import java.util.ArrayList;

import org.apache.log4j.Logger;

/**
 *
 * @author vaiojmc
 */
public class Tarifa implements java.io.Serializable{
    
    /**
	 * 
	 */
	private static final long serialVersionUID = -7146808244314239282L;
	static Logger logger = Logger.getLogger(Tarifa.class.getName());
    private float precioHora;
    private float precioFraccionHora;
    private int fraccionesHora;//numero de partes en que se dividio la hora
    private float minsEnFraccionHora;
    
    private float[] preciosEnTabla;

    private static java.util.ArrayList<Tarifa> tarifas=new java.util.ArrayList<Tarifa>();
    public static int indicePrecioProductoPrint;
    
    public Tarifa()
    {
    }
    public Tarifa(float precioHora,float precioFraccionHora,int fraccionesHora)
    {
        this.precioHora=precioHora;
        this.precioFraccionHora=precioFraccionHora;
        this.fraccionesHora=fraccionesHora;
        minsEnFraccionHora=60.0f/this.fraccionesHora;
    }
    public static float calculaMonto(TimeIncremental intervalo)
    {
        float totalMonto=0;
        if(tarifas.size()==0 )///si vamos a calcular el monto, pero no tenemos definidas las tarifas, no cobramos nada
            return 0;
        Tarifa tarifaActual=tarifas.get(0);
        int i=0;
        for(i=0;i<intervalo.getHour();++i)///vamos a ir acumulando el monto del precio por cada hora en el intervalo
        {
            //tarifaActual=(Tarifa)tarifas.get(i);
            if(i<tarifas.size())//esto es para asegurarnos de que estamos recorriendo bien al arreglo de tarifas
                tarifaActual=(Tarifa)tarifas.get(i);//solo se actualiza la tarifa siempre que haya todavia en el arreglo. 
                                                    //si ya no hay, entonces siempre se trabaja con la ultima tarifa que se
                                                    //recupero del arreglo
            totalMonto+=tarifaActual.getPrecioHora();//aqui acumulamos el precio de esa hora
            
        }
        if(i<tarifas.size())//esto es para asegurarnos de que estamos recorriendo bien al arreglo de tarifas
            tarifaActual=(Tarifa)tarifas.get(i);
        
        //calculamos cuantas fracciones de hora se van a cobrar
        // minutos del intervalo / numero de mins en la fraccion
        int fracsACobrar=(int)(intervalo.getMinute()*1.0f/tarifaActual.minsEnFraccionHora*1.0f);
        //Aunque en el intervalo, hayan minutos que no completan una fraccion de hora, 
        //esos minutos tambien se cobran como otra fraccion de hora (el residuo de minutos)
        if(intervalo.getMinute()%tarifaActual.minsEnFraccionHora!=0)
            fracsACobrar++;
        else
        if(intervalo.getSecond()!=0)
            fracsACobrar++;
        //ahora al total de horas, le sumamos el total de fracciones de hora, para obtener el
        //monto total
        //totalMonto+=fracsACobrar*tarifaActual.getPrecioFraccionHora();
        if(fracsACobrar==0)
            fracsACobrar=1;
        totalMonto+=tarifaActual.preciosEnTabla[fracsACobrar-1];
        //logger.info("PRECIO MINS:"+(fracsACobrar-1)+".- "+tarifaActual.preciosEnTabla[fracsACobrar-1]);
        //logger.info("TOTAL:"+totalMonto);
        return totalMonto;
    }
    public static void addTarifaToCollection(Tarifa tarifa)
    {
        tarifas.add(tarifa);
    }
    public static void revemoAllTarifas()
    {
        tarifas.clear();
    }

        public void setFraccionesHora(int fraccionesHora) {
        this.fraccionesHora = fraccionesHora;
    }
    

    public int getFraccionesHora() {
        return fraccionesHora;
    }

    public float getMinsEnFraccionHora() {
        return minsEnFraccionHora;
    }

    public void setMinsEnFraccionHora(float minsEnFraccionHora) {
        this.minsEnFraccionHora = minsEnFraccionHora;
    }

    public float getPrecioFraccionHora() {
        return precioFraccionHora;
    }

    public void setPrecioFraccionHora(float precioFraccionHora) {
        this.precioFraccionHora = precioFraccionHora;
    }

    public float getPrecioHora() {
        return precioHora;
    }

    public void setPrecioHora(float precioHora) {
        this.precioHora = precioHora;
    }

    public static ArrayList<Tarifa> getTarifas() {
        return tarifas;
    }

    public static void setTarifas(ArrayList<Tarifa> tarifas) {
        Tarifa.tarifas = tarifas;
    }

    public void setPreciosEnTabla(float[] preciosEnTabla) {
        this.preciosEnTabla = preciosEnTabla;
    }

    public float[] getPreciosEnTabla() {
        return preciosEnTabla;
    }
    public String toString()
    {
        String precios="";
        if(preciosEnTabla!=null)
        	for(int i=0;i<preciosEnTabla.length;++i)
        		precios+=(preciosEnTabla[i]+",");
        
        String f="\n<Tarifa>\n"+
        "    <precioHora>"+precioHora+"</precioHora>\n"+
        "    <precioFraccionHora>"+precioFraccionHora+"</precioFraccionHora>\n"+
        "    <fraccionesHora>"+fraccionesHora+"</fraccionesHora>\n"+
        "    <minsEnFraccionHora>"+minsEnFraccionHora+"</minsEnFraccionHora>\n"+
        "    <preciosEnTabla>"+precios+"</preciosEnTabla>\n"+
        "</Tarifa>\n";
        return f;
    
    }
    public static void loggerHoras()
    {
        for(int i=0;i<tarifas.size();++i)
        {
            logger.info(((Tarifa)tarifas.get(i)) .toString() );
        }
        
    
    }

    

    
    
    
    
    
}
